import collections
# 给定一个包含大写字母和小写字母的字符串，找到通过这些字母构造成的最长的回文串。
# 在构造过程中，请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
# 假设字符串的长度不会超过 1010。
#
# 输入:  "abccccdd"
# 输出: 7
#
# 解释:
# 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。


# https://leetcode-cn.com/problems/longest-palindrome/

# 执行用时 :36 ms 击败了70.67%的用户
# 内存消耗 :13.5 MB, 击败了5.32%的用户

# 就还是很普通的写法...
class Solution:
    def longestPalindrome(self, s: str) -> int:
        putout = 0
        for i in set(s[:]):
            times = s.count(i)
            if times % 2 == 0:
                s = s.replace(i, "", times)
                putout += times
            else:
                if not times // 2 == 0:
                    temp_pow = times // 2
                    s = s.replace(i, "", 2 * temp_pow)
                    putout += 2 * temp_pow
        else:
            if len(s) >= 1:
                putout += 1

        return putout


# 复盘 抄官方答案...
# 思路是一样的, 然而别人家的代码真漂亮
def longestPalindrome_answer(s):
    ans = 0
    count = collections.Counter(s)
    for v in count.values():
        ans += v // 2 * 2
        if ans % 2 == 0 and v % 2 == 1:
            ans += 1
    return ans


longestPalindrome_answer("AHGDKJGddhdjaliiwbbwbwbwbw")

# 没读出来的题目隐含信息
# 由于题目中保证了给定的字符串 s 只包含大小写字母，因此我们也可以使用哈希映射（HashMap）来存储每个字符出现的次数，
# 如果使用哈希映射，最多只会存储 52 个（即小写字母与大写字母的数量之和）键值对。
